home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
docs
/
mags
/
saku09.lha
/
Teksti
/
Demot.txt
< prev
next >
Wrap
Text File
|
1994-10-20
|
9KB
|
198 lines
5
1*
{3 Resepti ympäristöystävälliselle demolle
{3 ---------------------------------------
Aki Laukkanen
Muistatteko parin vuoden takaiset ajat, jolloin demon saaminen toimimaan omalla
koneellasi oli suoranainen ihme? Tuolloin demot oli suunniteltu vain yhdelle ko-
koonpanolle: A500 + 0.5MB CHIP-muistia. Jos oma kokoonpanosi poikkesi kysei-
sestä, sait useimmissa tapauksissa unohtaa demon kokeilemisen. Syitä oli monia:
itseään muuttava koodi, tiettyyn osoitteeseen käännetty tai tiettyä muistialuet-
ta suoraan ilman varaamista osoittava koodi, osoiterekisterien ylimpien bittien
käyttäminen datana, busy-looppien käyttäminen ajoitukseen, kaikenlaiset oletuk-
set koneen tilasta ja nopeudesta jne. Luetteloa voisi jatkaa loputtomiin. Miten
nykypäivinä?
Nykyään konekokoonpanoihin on tullut vain lisää variaatiota: AGA tuli sotkemaan
asioita loppuvuodesta 1992 uuden käyttöjärjestelmän ja uusien prosessorien kera.
Oli luonnollista ajatella, etteivät vanhat demot toimi uusissa koneissa. Eihän
silloin voitu edes varautua tuleviin muutoksiin Commodoren (R.I.P.) nihkeän po-
litiikan vuoksi. Ajat muuttuivat, ja uudeksi "jokamiehen kokoonpanoksi" vakiin-
tui A1200 ja ehkä jonkin verran FAST-muistia, joten demotkin alkoivat luonnolli-
sesti hyödyntää em. kokoonpanoa. Mutta mihin jäivät muut koneet ja kokoonpanot?
Ilmeisesti osalle koodereista ovat VGA- ja multisync-monitorit tuntemattomia.
Näin ollen ei voida pitää varmana, että käytössä oleva näyttömoodi demoa käyn-
nistettäessä olisi PAL High Res. Jos näyttömoodi "sattumalta" onkin joku toinen,
kuten MULTISCAN tai DBLPAL, ei kone osaa tulkita copperlistiä oikein, vaan seu-
rauksena on pikselien sekasotku. Oikea ratkaisu olisi ollut LoadView(NULL);
WaitTOF(); WaitTOF(); -kutsusarja, jota onneksi yhä useammat kooderit ovat alka-
neet käyttää. Tämä näkyy esimerkiksi verrattaessa The Party III:n ja Assembly
'94:n demoja. Jälkimmäisistä huomattavasti suurempi osa toimii "systee-
miystävällisemmin".
Edelleen tuntematon näyttää olevan 68040-prosessori, erityisesti sen Writeback-
cachet. Käytössä olevan prosessorinhan saa tietää ExecBasen AttnFlags-kentästä.
Kyseisen kentän bittien merkitykset on selostettu Exec/execbase.i-tiedostossa.
Kolmas skenaario toteutuu, jos onneton käyttäjä yrittää kokeilla AGA-demoa
ECS/OCS-koneessa. Jotkut demot eivät testaa piirisarjaa, vaan yrittävät käyttää
AGA-rekistereitä ja muita uusia ominaisuuksia - jälleen seuraa ilotulitus.
Käytetyn apuprosessorisetin voi tarkistaa monella tavalla. Yksinkertainen tapa
on GfxBase:n ChipRevBits0-kenttä. Mahdolliset bittiyhdistelmät on selostettu
graphics/gfxbase.i- tiedostossa. On kuitenkin muistettava, että kenttä otettiin
käyttöön vasta Kickstart V39:ssä. Toinen tapa on katsoa suoraan LISAID- rekiste-
riä ($dff07c). Rekisteri otettiin kuitenkin käyttöön vasta ECS:ssä, joten on
huolehdittava, että väylällä on joku tietty luku esim. kirjoittamalla johonkin
hardware-rekisteriin. (Kiitokset tiedosta Sami Klemolalle.) Mahdolliset vaih-
toehdot ovat $fc (ECS Denise), $f8 (AGA Lisa) tai viimeksi väylällä ollut luku
(OCS Denise). Tietysti on myös muistettava mahdolliset tulevat apuprosessorise-
tit kuten AAA ja Hombre. Toisaalta, jos prosessorina on HP PA-Risc, niin mahdol-
lisista oletuksista ei liene hyötyä?-)
Muitakin seikkoja on toki muistettava. Nykyisinhän ovat monet demot WB-käynnis-
tettäviä, eli niillä on oma ikoni. Tällaisen ohjelman täytyy muistaa vastata
WBenchMsg:een ohjelmasta poistuttaessa, jotta Workbench voi vapauttaa sen vaati-
man muistin. Lisäksi olisi syytä osata disabloida käyttöjärjestelmä oikein Exe-
cin Disable()-rutiinilla.
PS. Artikkelin ohella olen tehnyt pienen koodinpätkän, joka tarkistaa prosesso-
rin ja apurosessorit, osaa vastata WBenchMsg:hen, tallettaa vanhan Viewin ja te-
kee muiden näyttötilojen käytön mahdolliseksi. Lisäksi se disabloi moniajon.
Mahdolliset testien tulokset ohjelmanpätkä jättää pääohjelman tutkittavaksi. Ot-
takaa huomioon, että sitä ei ole testattu eikä optimoitu mitenkään, joten se ei
_varmastikaan_ ole paras tapa tehdä asiat.
include "exec/types.i"
include "libraries/dosextens.i"
include "graphics/gfxbase.i"
include "exec/libraries.i"
include "exec/execbase.i"
xref _LVOFindTask
xref _LVOWaitPort
xref _LVOForbid
xref _LVOGetMsg
xref _LVOReplyMsg
xref _LVODisable
xref _LVOEnable
xref _LVOOpenLibrary
xref _LVOCloseLibrary
xref _LVOLoadView
xref _LVOWaitTOF
NOCHIPREV equ 0
SECTION CODE,code
startup:
movem.l d0/a0,-(sp) ; Tallennetaan d0 ja a0
move.l 4,a6 ; SysBase
move.l #0,a1
jsr _LVOFindTask(a6) ; Haetaan oma prosessi
; jsr -$0126(a6)
move.l d0,a4
move.l d0,process
tst.l pr_CLI(a4) ; CLI?
; tst.l $ac(a4)
bne.s check_aga ; jos CLI niin check_aga
wb:
lea pr_MsgPort(a4),a0 ; Haetaan prosessin viestiportti
; lea $5c(a4),a0
jsr _LVOWaitPort(a6) ; Odotetaan viestiä
; jsr -$0180(a6)
lea pr_MsgPort(a4),a0
jsr _LVOGetMsg(a6) ; Haetaan viesti
; jsr -$0174(a6)
move.l d0,wbenchmsg ; tallennetaan ohjelman tarvetta
; varten
check_aga:
moveq #0,d0
lea gfxname,a1 ; avataan
jsr _LVOOpenLibrary(a6) ; graphics.library
; jsr -$0228(a6)
move.l d0,gfxbase
beq.w reply_to_wb ; jostain syystä ei saatu avattua
move.l d0,a4
jsr _LVODisable(a6) ; keskeytykset pois
; jsr -$0078(a6)
cmp.w #39,LIB_VERSION(a4) ; onko ChipRevBits0 määritelty
; cmp.w #39,$14(a4)
bne.s no_chiprev
move.b gb_ChipRevBits0(a4),chiprev
; move.b $ec(a4),chiprev
bra.s check_proc
no_chiprev:
move.b #NOCHIPREV,chiprev ; Ei pystyta hakemaan ChipRevBits:ia
check_proc:
move.w AttnFlags(a6),processor ; CPU ja FPU
; move.w $128(a6),processor
clear_view:
move.l gfxbase,a6
move.l gb_ActiView(a6),oldview ; nykyinen View talteen
; move.l $22(a6),oldview
move.l #0,a1 ; NULL View tilalle
jsr _LVOLoadView(a6) ; jsr -$00de(a6)
jsr _LVOWaitTOF(a6) ; jsr -$010e(a6)
jsr _LVOWaitTOF(a6)
move.l 4,a6 ; SysBase valmiiksi
movem.l (sp)+,d0/a0 ; d0/a0 pois pinosta
bsr.s _main ; hypätään pääohjelmaan
move.l d0,-(sp) ; palautuskoodi turvaan
old_view:
move.l gfxbase,a6
move.l oldview,a1 ; vanha View
jsr _LVOLoadView(a6) ; jsr -$00de(a6)
move.l 4,a6 ; jsr -$007e(a6)
jsr _LVOEnable(a6) ; keskeytykset päälle
move.l a6,a1 ; suljetaan graphics.library
jsr _LVOCloseLibrary(a6) ; jsr -$019e(a6)
reply_to_wb:
tst.l wbenchmsg ; onko workbench
beq.s exit ; jos ei niin exit
jsr _LVOForbid(a6) ; huomaa ettei tarvitse Permit()
; jsr -$0084(a6)
move.l wbenchmsg,a1
jsr _LVOReplyMsg(a6) ; jsr -$017a(a6)
exit:
move.l (sp)+,d0
rts ; poistutaan ohjelmasta
_main: moveq #0,d0 ; palautuskoodi
rts ; pääohjelma
SECTION DATA,data
wbenchmsg dc.l 0
oldview dc.l 0
process dc.l 0
gfxbase dc.l 0
processor dc.w 0 ; AFB_68010 equ 0
; AFB_68020 equ 1
; AFB_68030 equ 2
; AFB_68040 equ 3
; AFB_68881 equ 4
; AFB_68882 equ 5
; AFB_FPU40 equ 6
; AFB_68060 equ 7
chiprev dc.b 0 ; GFXB_BIG_BLITS equ 0
; GFXB_HR_AGNUS equ 0
; GFXB_HR_DENISE equ 1
; GFXB_AA_ALICE equ 2
; GFXB_AA_LISA equ 3
gfxname dc.b 'graphics.library',0
end